---
id: 交叉类型
title: 交叉类型 （Intersection）
---
作用是合并类型，使用 & 符号。  

```ts
// 合并两个对象
type user = {name:string} & {age: number};


// 合并两个接口
interface Name {name:string};
interface Age {age:number};
type userInfo = Name & Age; 

```

如果在原始类型上使用则会指向never类型

```ts 
type SN = string & number; // never 类型  就是这个类型即可以是string 又是 number 类型，在JS中是不存在的。

let num: SN = 1; // 报错：不能将类型“number”分配给类型“never”。
```
联合类型 （string | number）  意思是即可能是string类型，也可能是number类型，但到最后肯定只是一种类型。  
而交叉类型（string & number） 表达的意思是 即是string类型又是number类型，这种类型是不存在的。

## 交叉运算符满足以下这些特性：

唯一性：A & A 等价于 A  
满足交换律：A & B 等价于 B & A  
满足结合律：(A & B) & C 等价于 A & (B & C)  
父类型收敛：如果 B 是 A 的父类型，则 A & B 将被收敛成 A 类型  

```ts 
type A0 = 1 & number; // 1
type A1 = "1" & string; // "1"
type A2 = true & boolean; // true

type A3 = any & 1; // any
type A4 = any & boolean; // any
type A5 = any & never; // never
```

在以上代码中，any 类型和 never 类型比较特殊。除了 never 类型之外，任何类型与 any 类型进行交叉运算的结果都是 any 类型。